package action

import (
	"context"

	"github.com/glennliao/apijson-go/config"
	"github.com/glennliao/apijson-go/consts"
	"github.com/glennliao/apijson-go/model"
	"github.com/glennliao/apijson-go/query"
	"github.com/samber/lo"
)

type C操作执行请求 struct {
	F方法     string
	B表名     string
	S数据     []model.Map
	T条件     []model.Map
	F访问配置   *config.F访问配置结构
	C操作配置   *config.C操作配置
	X新建查询函数 func(ctx context.Context, req model.Map) *query.C查询结构体
}

var C操作执行器映射表 = map[string]C操作执行器{}

func X注册执行器(名称 string, 执行器 C操作执行器) {
	C操作执行器映射表[名称] = 执行器
}

func H获取操作执行器(名称 string) (C操作执行器, error) {
	if 名称 == "" {
		名称 = "default"
	}
	if 执行器, 存在 := C操作执行器映射表[名称]; 存在 {
		return 执行器, nil
	}
	return nil, consts.X新建系统错误("操作执行器未找到: " + 名称)
}

func C操作执行器列表() []string {
	return lo.Keys(C操作执行器映射表)
}

type C操作执行器 interface {
	Z执行(ctx context.Context, 请求 C操作执行请求) (返回结果 model.Map, 错误 error)
}

// 事务处理函数
type S事务处理函数 func(ctx context.Context, 操作 func(ctx context.Context) error) error

type S事务解析器 func(ctx context.Context, 请求 *C操作) S事务处理函数

var W无事务处理函数 = func(ctx context.Context, 操作 func(ctx context.Context) error) error {
	return 操作(ctx)
}

var Q全局事务解析器 S事务解析器

func Z注册事务解析器(解析器 S事务解析器) {
	Q全局事务解析器 = 解析器
}

func H获取事务处理函数(ctx context.Context, 请求 *C操作) S事务处理函数 {
	return Q全局事务解析器(ctx, 请求)
}
